home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / PROGRAMR / OLE2BOOK.ZIP / CHAP06.ZIP / CHAP06 / EDATAOBJ / DATAOBJ.H < prev    next >
C/C++ Source or Header  |  1993-04-14  |  7KB  |  206 lines

  1. /*
  2.  * DATAOBJ.H
  3.  *
  4.  * Classes that implement the Data Object independent of whether
  5.  * we live in a DLL or EXE.
  6.  *
  7.  * Copyright (c)1993 Microsoft Corporation, All Right Reserved
  8.  *
  9.  * Kraig Brockschmidt, Software Design Engineer
  10.  * Microsoft Systems Developer Relations
  11.  *
  12.  * Internet  :  kraigb@microsoft.com
  13.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  14.  */
  15.  
  16.  
  17. #ifndef _DATAOBJ_H_
  18. #define _DATAOBJ_H_
  19.  
  20.  
  21. #include <windows.h>
  22. #include <ole2.h>
  23. #include <bookguid.h>
  24.  
  25. //Type for an object-destroyed callback
  26. typedef void (FAR PASCAL *LPFNDESTROYED)(void);
  27.  
  28.  
  29. //Data size types
  30. #define DOSIZE_SMALL        0
  31. #define DOSIZE_MEDIUM       1
  32. #define DOSIZE_LARGE        2
  33. #define DOSIZE_CSIZES       3
  34.  
  35. //Data sizes
  36. #define CCHTEXTSMALL        64      //Text grows * 16 charactrs
  37. #define CCHTEXTMEDIUM       1024
  38. #define CCHTEXTLARGE        16384
  39.  
  40. #define CXYBITMAPSMALL      16      //Bitmaps grow * 4 pixels
  41. #define CXYBITMAPMEDIUM     64
  42. #define CXYBITMAPLARGE      256
  43.  
  44. #define CRECMETAFILESMALL   4       //Metafiles grows * 9 records since
  45. #define CRECMETAFILEMEDIUM  12      //the number of actual records is the
  46. #define CRECMETAFILELARGE   36      //square of these numbers.
  47.  
  48.  
  49. //Resources for this data object.
  50. #define IDB_MIN             1       //Keep this DOSIZE_SMALL+1
  51. #define IDB_16BY16          1
  52. #define IDB_64BY64          2
  53. #define IDB_256BY256        3
  54. #define IDB_MAX             3
  55.  
  56.  
  57. #define IDR_MENU                        1
  58. #define IDR_ADVISORICON                 1
  59.  
  60. #define IDM_ADVISEITERATIONSMIN         100
  61. #define IDM_ADVISEITERATIONS16          100
  62. #define IDM_ADVISEITERATIONS64          101
  63. #define IDM_ADVISEITERATIONS144         102
  64. #define IDM_ADVISEITERATIONS256         103
  65. #define IDM_ADVISEITERATIONS400         104
  66. #define IDM_ADVISEITERATIONS572         105
  67.  
  68.  
  69.  
  70.  
  71. /*
  72.  * The DataObject object is implemented in its own class with its own
  73.  * IUnknown to support aggregation.  It contains one CImpIDataObject
  74.  * object that we use to implement the externally exposed interfaces.
  75.  */
  76.  
  77. #define CFORMATETCGET       3
  78.  
  79.  
  80. //DATAOBJ.CPP
  81. LRESULT FAR PASCAL __export AdvisorWndProc(HWND, UINT, WPARAM, LPARAM);
  82.  
  83.  
  84. class __far CDataObject : public IUnknown
  85.     {
  86.     //Make any contained interfaces your friends so they can get at you
  87.     friend class CImpIDataObject;
  88.     friend LRESULT FAR PASCAL __export AdvisorWndProc(HWND, UINT, WPARAM, LPARAM);
  89.  
  90.     protected:
  91.         ULONG               m_cRef;         //Object reference count.
  92.         LPUNKNOWN           m_punkOuter;    //Cont. Unk. for aggregation
  93.         LPFNDESTROYED       m_pfnDestroy;   //Function to call on closure.
  94.  
  95.         UINT                m_iSize;        //Data size for ::Render*
  96.         HBITMAP             m_rghBmp[DOSIZE_CSIZES];    //Cached bitmaps
  97.  
  98.         HWND                m_hWndAdvise;   //Popup with Advise menu
  99.         DWORD               m_dwAdvFlags;   //Notification flags.
  100.  
  101.         //Contained interface implemetation
  102.         LPDATAOBJECT        m_pIDataObject;
  103.  
  104.         //Other interfaces used, implemented elsewhere
  105.         LPDATAADVISEHOLDER  m_pIDataAdviseHolder;
  106.  
  107.         //Arrays for IDataObject::EnumFormatEtc
  108.         ULONG               m_cfeGet;
  109.         FORMATETC           m_rgfeGet[CFORMATETCGET];
  110.  
  111.     protected:
  112.         //Functions for use from IDataObject::GetData
  113.         HRESULT     RenderText(LPSTGMEDIUM);
  114.         HRESULT     RenderBitmap(LPSTGMEDIUM);
  115.         HRESULT     RenderMetafilePict(LPSTGMEDIUM);
  116.  
  117.     public:
  118.         CDataObject(LPUNKNOWN, LPFNDESTROYED, UINT);
  119.         ~CDataObject(void);
  120.  
  121.         BOOL FInit(void);
  122.  
  123.         //Non-delegating object IUnknown
  124.         STDMETHODIMP         QueryInterface(REFIID, LPVOID FAR *);
  125.         STDMETHODIMP_(ULONG) AddRef(void);
  126.         STDMETHODIMP_(ULONG) Release(void);
  127.     };
  128.  
  129. typedef CDataObject FAR * LPCDataObject;
  130.  
  131.  
  132.  
  133. /*
  134.  * Interface implementations for the CDataObject object.
  135.  */
  136.  
  137. class __far CImpIDataObject : public IDataObject
  138.     {
  139.     private:
  140.         ULONG           m_cRef;         //Interface reference count.
  141.         LPVOID          m_pObj;         //Back pointer to the object.
  142.         LPUNKNOWN       m_punkOuter;    //Controlling unknown for delegation
  143.  
  144.     public:
  145.         CImpIDataObject(LPVOID, LPUNKNOWN);
  146.         ~CImpIDataObject(void);
  147.  
  148.         //IUnknown members that delegate to m_punkOuter.
  149.         STDMETHODIMP         QueryInterface(REFIID, LPVOID FAR *);
  150.         STDMETHODIMP_(ULONG) AddRef(void);
  151.         STDMETHODIMP_(ULONG) Release(void);
  152.  
  153.         //IDataObject members
  154.         STDMETHODIMP GetData(LPFORMATETC, LPSTGMEDIUM);
  155.         STDMETHODIMP GetDataHere(LPFORMATETC, LPSTGMEDIUM);
  156.         STDMETHODIMP QueryGetData(LPFORMATETC);
  157.         STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC, LPFORMATETC);
  158.         STDMETHODIMP SetData(LPFORMATETC, STGMEDIUM FAR *, BOOL);
  159.         STDMETHODIMP EnumFormatEtc(DWORD, LPENUMFORMATETC FAR *);
  160.         STDMETHODIMP DAdvise(FORMATETC FAR *, DWORD,  LPADVISESINK, DWORD FAR *);
  161.         STDMETHODIMP DUnadvise(DWORD);
  162.         STDMETHODIMP EnumDAdvise(LPENUMSTATDATA FAR *);
  163.     };
  164.  
  165.  
  166.  
  167. /*
  168.  * IEnumFORMATETC object that is created from IDataObject::EnumFormatEtc.
  169.  * This object lives on its own, that is, QueryInterface only knowns
  170.  * IUnknown and IEnumFormatEtc, nothing more.  We still use an outer
  171.  * unknown for reference counting, because as long as this enumerator
  172.  * lives, the data object should live, thereby keeping the application up.
  173.  */
  174.  
  175. class __far CEnumFormatEtc : public IEnumFORMATETC
  176.     {
  177.     private:
  178.         ULONG           m_cRef;         //Object reference count.
  179.         LPUNKNOWN       m_punkRef;      //IUnknown for reference counting.
  180.         ULONG           m_iCur;         //Current element.
  181.         ULONG           m_cfe;          //Number of FORMATETCs in us
  182.         LPFORMATETC     m_prgfe;        //Source of FORMATETCs
  183.  
  184.     public:
  185.         CEnumFormatEtc(LPUNKNOWN, ULONG, LPFORMATETC);
  186.         ~CEnumFormatEtc(void);
  187.  
  188.         //IUnknown members that delegate to m_punkOuter.
  189.         STDMETHODIMP         QueryInterface(REFIID, LPVOID FAR *);
  190.         STDMETHODIMP_(ULONG) AddRef(void);
  191.         STDMETHODIMP_(ULONG) Release(void);
  192.  
  193.         //IEnumFORMATETC members
  194.         STDMETHODIMP Next(ULONG, LPFORMATETC, ULONG FAR *);
  195.         STDMETHODIMP Skip(ULONG);
  196.         STDMETHODIMP Reset(void);
  197.         STDMETHODIMP Clone(IEnumFORMATETC FAR * FAR *);
  198.     };
  199.  
  200.  
  201. typedef CEnumFormatEtc FAR * LPCEnumFormatEtc;
  202.  
  203.  
  204.  
  205. #endif //_DATAOBJ_H_
  206.